// 经典⾯试题：循环中使⽤闭包解决 var 定义函数的问题


// for 循环是一个同步任务， 会先执行， setTimeout 是异步任务，放在宏任务队列中， 会在循环结束后执行。
// ⾸先因为 setTimeout 是个异步函数，所以会先把循环全部执⾏完毕，这时候 i 就是 6了，所以会输出⼀堆 6。
for (var i = 1; i <= 5; i++) {
  setTimeout(function timer() {
  console.log(i)
  }, i * 1000)
 }

//  解决方法1：
// ⾸先使⽤了⽴即执⾏函数将 i 传⼊函数内部，这个时候值就被固定在了参数 j 上⾯不会改变，当下次执⾏ timer 这个闭包的时候，就可以使⽤外部函数的变量j ，从⽽达到⽬的。
for (var i = 1; i <= 5; i++) { (function(j) { 
  setTimeout(function timer() { 
    console.log(j) 
  }, j * 1000) 
  })(i)
}

// 第⼆种就是使⽤ setTimeout 的第三个参数，这个参数会被当成 timer 函数的参数传⼊。
for (var i = 1; i <= 5; i++) {
  setTimeout(
    function timer(j) {
      console.log(j)
    },
    i * 1000, i
  )
 }

//  第三种就是使⽤ let 定义 i 了来解决问题了，这个也是最为推荐的⽅式
for (let i = 1; i <= 5; i++) {
  setTimeout(
    function timer() {
      console.log(i)
    }, i * 1000
  )
 }

 